home *** CD-ROM | disk | FTP | other *** search
/ Tiger Disk 6 / Tiger_Disk_006_19xx_Tiger-Crew-Disk_de_Side_B.d64 / 4 mk (.txt) < prev    next >
Commodore BASIC  |  2023-02-26  |  7KB  |  174 lines

  1. 8 clr
  2. 10 u$="[197][197][197][197][197][197][197][197][197]":o$="[164][164][164][164][164][164][164][164][164]":a$="adressierung"
  3. 20 print"[147][164][164]";o$;o$;o$;o$:print"syntax-lehrgang 'maschinensprache' (4)"
  4. 30 fori=0to999:next
  5. 100 data162,0,181,0,157,0,128,232,208,248,96
  6. 110 restore:fori=0to10:readin:poke826+i,in:next
  7. 200 print"[147][164][164][164]";o$;o$;o$:print"1.2.3.9. relative-";a$;"[146]"
  8. 210 print"wir kommen nun  zu  dem  wichtigen  ab-"
  9. 220 print"schnitt  der  bedingten  sprungbefehle."
  10. 230 print"je nach ergebnis  einer rechenoperation"
  11. 240 print"fuehrt die cpu einen sprung im programm"
  12. 250 print"aus oder nicht.  eine eigenart  der cpu"
  13. 260 print"6502 ist, dass derartige spruenge stets"
  14. 270 print"relativ sind.  d.h.:  es wird nicht die"
  15. 280 print"adresse angegeben,die angesprungen wer-"
  16. 290 print"den soll, sondern die anzahl der bytes,"
  17. 300 print"die die cpu ueberspringen soll.":printu$;u$;u$;"[197][197][197][197][145]"
  18. 310 i=1:gosub5000:ifflthen20
  19. 400 print"[147]ein  wichtiger  bedingter  sprungbefehl"
  20. 410 print"sei vorweggenommen: 'bne'. er bedeutet:"
  21. 420 print"[164][157]b[146]ranch  if[160] result  [160]n[146][145][157][164]ot [160]e[146][145][157][164]qual  [160]zero."
  22. 430 print"(springe,  falls das ergebnis  ungleich"
  23. 435 print"null war !)"
  24. 440 print"der befehl 'bne $08' bedeutet  fuer die"
  25. 450 print"cpu: falls das ergebnis der letzten re-"
  26. 460 print"chenoperation ungleich null war, ueber-"
  27. 470 print"springe die naechsten $08 befehlsbytes!"
  28. 480 print"gezaehlt wird ab dem ersten befehl nach"
  29. 490 print"dem  sprungbefehl  und   der  relativen"
  30. 500 print"adresse."
  31. 510 i=2:gosub5000:ifflthen200
  32. 600 print"[147]also: * 0. byte 'bne'"
  33. 610 printtab(6);"* 1. byte  $08"
  34. 620 printtab(7);" 2. byte  ...  [192][192][174]"
  35. 625 printtab(24);"[221]"
  36. 630 forn=3to9:printtab(7);n;"[157]. byte  ...    [221]":printtab(24);"[221]":next
  37. 640 printtab(7);"10. byte 'lda' _[192][189]"
  38. 650 print"";tab(27);"acht"
  39. 660 printtab(27);"byte"
  40. 670 printtab(27);"vorwaerts-"
  41. 680 printtab(27);"sprung"
  42. 740 i=3:gosub5000:ifflthen400
  43. 800 print"[147]der befehl  'bne $00'  bedeutet  ueber-"
  44. 810 print"springen von null bytes,  also effektiv"
  45. 820 print"keinen sprung."
  46. 830 print"die cpu kann maximal 127 byte vorwaerts"
  47. 840 print"springen (mit 'bne $7f').  rueckwaerts-"
  48. 850 print"spruenge sind folgendermassen moeglich:"
  49. 860 print"$00 = 0 byte rueckwaerts"
  50. 870 print"$ff = 1 byte rueckwaerts"
  51. 880 print"$fe = 2 byte rueckwaerts"
  52. 890 print"$fd = 3 byte rueckwaerts, etc."
  53. 910 i=4:gosub5000:ifflthen600
  54. 1000 print"[147]der  weiteste   rueckwaertssprung  geht"
  55. 1010 print"ueber 128 byte: 'bne $80'."
  56. 1020 printb$;"rueckwaertssprung 8 byte:":printu$
  57. 1030 printtab(10);"0. byte 'lda' _[192][174]"
  58. 1040 printtab(26);"[221]"
  59. 1050 forn=1to7:printtab(9);n;"[157]. byte  ...    [221]":printtab(26);"[221]":next
  60. 1060 printtab(10);"8. byte  ...  [192][192][189]"
  61. 1080 print"";tab(29);"acht"
  62. 1090 printtab(29);"byte"
  63. 1100 printtab(29);"rueck-"
  64. 1110 printtab(29);"waerts-"
  65. 1120 printtab(8);"*";tab(18);"'bne'";tab(29);"sprung"
  66. 1130 printtab(8);"*";tab(19);"$f8"
  67. 1160 i=5:gosub5000:ifflthen800
  68. 1200 print"[147]vorteil der relativen ";a$;": die"
  69. 1210 print"programme koennen  in den rams beliebig"
  70. 1220 print"verlagert werden, da ja keine absoluten"
  71. 1230 print"adressen verwendet werden."
  72. 1240 print"nachteile:   die  berechnung  relativer"
  73. 1250 print"adressen ist  muehsam und fehlertraech-"
  74. 1260 print"tig. die sprungweite ist sehr begrenzt."
  75. 1270 print"i.a. uebernimmt  ein  assemblerprogramm"
  76. 1280 print"die berechnung,  so dass wenigstens die"
  77. 1290 print"ersten nachteile behebbar sind."
  78. 1310 i=6:gosub5000:ifflthen1000
  79. 1400 print"[147]";o$;o$;o$:print"1.2.4. ein erstes beispiel [146]"
  80. 1410 print"wir waehlen nochmals das problem daten-"
  81. 1420 print"transfer.   wir wollen ein programm er-"
  82. 1430 print"stellen,  das die inhalte  der speicher"
  83. 1440 print"$0000 - $00ff nach $8000 - $80ff ueber-"
  84. 1450 print"traegt."
  85. 1460 print"$0000 - $00ff ist die zeropage,"
  86. 1470 print"$8000 - $80ff ist das erste viertel des"
  87. 1480 print"bildschirmspeichers."
  88. 1510 i=7:gosub5000:ifflthen1200
  89. 1600 print"[147]um das problem programmieren zu koennen"
  90. 1610 s$="      ":print"muessen wir  vier weitere   cpu-befehle"
  91. 1620 print"vorwegnehmen:  'ldx','sta','inx','rts'."
  92. 1630 print"  'ldx' (load index x with memory)":printspc(9);"[163][160][160][163][160][160][160][160][160][160][160][163]"
  93. 1640 print"  'sta' (store accumulator to memory)":printspc(9);"[163][163][160][160][160][160][163]"
  94. 1650 print"  'inx' (increment index x by one)":printspc(9);"[163][163][160][160][160][160][160][160]        [163]"
  95. 1660 print"  'rts' (return from subroutine)":printspc(9);"[163] [163][160][160][160][160][160]    [163]"
  96. 1670 print"die vier  befehle  sind einfach zu ver-"
  97. 1680 print"stehen und bewirken folgendes:"
  98. 1690 print"'ldx' laed ein datenwort (byte) ins xr."
  99. 1700 prints$;"z.b. laed 'ldx # $00' $00 ins xr."
  100. 1710 i=8:gosub5000:ifflthen1400
  101. 1800 print"[147]'sta' ist die umkehrung von 'lda'.spei-"
  102. 1820 prints$;"chert den inhalt  des ac in einen"
  103. 1830 prints$;"speicher,  dessen adresse dem be-"
  104. 1840 prints$;"fehl folgt. z.b 'sta $0123' spei-"
  105. 1845 prints$;"chert inhalt des ac nach $0123."
  106. 1850 print"'inx' vergroessert den inhalt des xr um"
  107. 1860 prints$;"eins.  aus $a2 wird $a3,  aus $ff"
  108. 1870 prints$;"wird $00, etc."
  109. 1880 print"'rts' bewirkt den ruecksprung ins haupt"
  110. 1890 prints$;"programm nach aufruf eines unter-"
  111. 1900 prints$;"programms. (vgl. basic: 'return')"
  112. 1910 i=9:gosub5000:ifflthen1600
  113. 2000 print"[147]nun unser kleines programm:"
  114. 2010 printtab(16);"hex-code"
  115. 2015 print"ldx # $00       a2 00"
  116. 2020 print"lda $00,x   _[174]  b5 00":printtab(13);"[221]"
  117. 2030 print"sta $8000,x  [221]  9d 00 80":printtab(13);"[221]"
  118. 2040 print"inx          [221]  e8":printtab(13);"[221]"
  119. 2050 print"bne $f8     [192][189]  d0 f8"
  120. 2055 print"rts             60"
  121. 2060 print"wir schreiben dieses programm mit einem"
  122. 2070 print"assembler (z.b. syntax-assembler)  oder"
  123. 2080 print"mit einem monitor (z.b. tim-monitor) in"
  124. 2090 print"den 2. kassettenpuffer ab $033a."
  125. 2110 i=10:gosub5000:ifflthen1800
  126. 2200 print"[147]maschinenprogramme startet man  mit dem"
  127. 2210 print"unterprogrammaufruf 'sys (....)'.  nach"
  128. 2220 print"dem abarbeiten  des unterprogramms muss"
  129. 2230 print"der  ruecksprung  in das  hauptprogramm"
  130. 2240 print"folgen.  daher endet unser programm mit"
  131. 2250 print"dem ruecksprungbefehl 'rts'."
  132. 2310 i=11:gosub5000:ifflthen2000
  133. 2400 print"[147]funktionsweise  :":printu$;u$
  134. 2405 print"'ldx # $00' laed $00 ins xr.das xr wird"
  135. 2410 print" ";u$:print"als zaehler verwendet."
  136. 2420 print"'lda $00,x' laed  den inhalt  des zero-"
  137. 2430 print" ";u$:print"pagespeichers $00+x  in den ac.  da das"
  138. 2450 print"xr beim ersten durchlauf den inhalt $00"
  139. 2455 print"hat,  ist die speicheradresse einfach :"
  140. 2460 print"$00 + x = $00 + $00 = $00."
  141. 2510 i=12:gosub5000:ifflthen2200
  142. 2600 print"[147]'sta $8000,x' speichert  den inhalt des"
  143. 2620 print" [197][197]";u$:print"ac in den speicher $8000+x, beim ersten"
  144. 2630 print"durchlauf also nach $8000+ $00 = $8000."
  145. 2640 print"'inx' erhoeht  den inhalt  des xr um 1,"
  146. 2650 print" [197][197][197]":print"also von $00 auf $01."
  147. 2660 print"'bne $f8' bewirkt  einen ruecksprung um"
  148. 2670 printu$:print"acht bytes,falls das ergebnis der letz-"
  149. 2680 print"ten rechenoperation ungleich  null war."
  150. 2690 print"das war  der fall (xr auf $01 erhoeht)."
  151. 2710 i=13:gosub5000:ifflthen2400
  152. 2800 print"[147]der datentransfer wiederholt sich jetzt"
  153. 2820 print"mit x = $01, dann mit x = $02, etc. der"
  154. 2830 print"abbruch erfolgt, wenn x = $00 wird,also"
  155. 2840 print"muss vor 'inx' x = $ff gewesen sein.die"
  156. 2850 print"schleife  wird also fuer alle x von $00"
  157. 2860 print"bis $ff ausgefuehrt."
  158. 2870 print"das programm steht ab $033a (= dez 826)"
  159. 2880 print"starten sie es mit sys(826) !"
  160. 2890 print"verwenden sie auch folgendes basic-pro-"
  161. 2900 print"gramm: 10 sys (826) : goto 10"
  162. 3050 print"  - seite 14 -  <+> [145][164][164][164][164][157][157][157][157]ende[146]  <-> von vorne";
  163. 3060 gosub5020:onflgoto0:print"[147]":end:run
  164. 5000 rem umblaettern
  165. 5010 print"  - seite";i;"-  <+> weiter  <-> zurueck";
  166. 5020 fori=0to11:getx$:next
  167. 5030 getx$:ifx$=""then5030
  168. 5040 ifx$="+"thenfl=0:return
  169. 5050 ifx$="-"thenfl=1:return
  170. 5060 goto5030
  171. 5100 printtab(l)a$:printtab(l)"[221]";b$;"[221]":printtab(l)c$:return
  172. 6150 printtab(7);" 1. byte  $08"
  173. 10000 sys826:goto10000
  174.